package com.gai.shop.web.controller;

import com.gai.shop.common.Const;
import com.gai.shop.entity.Cart;
import com.gai.shop.entity.Product;
import com.gai.shop.entity.User;
import com.gai.shop.service.CartService;
import com.gai.shop.service.impl.CartServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class CartController extends BaseController {
    private final CartService CS = new CartServiceImpl();

    /**
     * 1.当我们用户点击加入购物车的时候，需要进行登录验证
     * 2.当我们点击加入购物车的时候，如果用户已经登录了，验证用户的购物车是否已经有该商品存在
     *          如果存在就在购物车的数据基础上数量+1，否则就新增一条购物车数据
     * dao==>addCart(Cart),updateCart(Cart),findCart(uid,pid)==>
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String operationCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1验证用户是否登录
        User user = (User)request.getSession().getAttribute(Const.LOGIN_USER);
        String pid = request.getParameter("pid");
        if (user == null){
            return Const.REDIRECT + "/login.jsp";
        }
        //让用户操作购物车
        CS.insertIntoCartByUidAndPid(user.getUid(),Integer.valueOf(pid));
        return Const.FORWARD + "/cartSuccess.jsp";
    }

    /**
     * 判断用户是否有登录有登录才进行数据的查询展示
     * 展示的数据是有商品名及商品价格等商品表数据
     * 所以要进行链表查询
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String showCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1验证用户是否登录
        User user = (User)request.getSession().getAttribute(Const.LOGIN_USER);
        if (user == null){
            return Const.REDIRECT + "/login.jsp";
        }
        List<Cart> cartList = CS.selectCartProductByUidAndPid(user.getUid());
        request.setAttribute(Const.UserConst.CARTS,cartList);
        return Const.FORWARD + "/cart.jsp";
    }

    /**
     * 1.前端的删除都是同一个方法调用
     * 2.他们传递的参数不一样，清空调用的时传递pid为0，删除传递的数据为要删除的商品的pid
     * 3.根据传入的pid的值如果为0即删除uid名下所有的购物车数据===>清空购物车
     *      dao的参数 uid
     * 4.根据传入的pid的值如果不为0，即删除uid名下的对应pid商品的数据===>删除购物车数据
     *      uid pid 用于确认是那条数据需要被删除
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String clearCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //我们可能需要使用到uid
        User user = (User)request.getSession().getAttribute(Const.LOGIN_USER);
        //
        Integer pid = Integer.valueOf(request.getParameter("pid"));
        CS.deleteCartByUid(user.getUid(),pid);
        return Const.FORWARD + "/cart?method=showCart";
    }

    /**
     * 这个修改前端
     * 1.当用户点击+或者-号的时候，触发购物车商品数量及小计价格的变量
     * 2.传入的参数是“pid”//商品id “cnum”//商品变化数量  “pprice”//单价
     * 3.根据传入的值进行更新处理
     * 注意：
     *  我们封装数据时，dao里面进行修改数据所需要的参数是cart对象类的pprice商品对象中的pid
     *  当我们设置小计价格时，需要进行计算：商品数量cnum*商品单价
     *  当商品数量为0时，进行数据删除的东西，而不是修改 删除需要参数为uid+pid用于确定删除那条数据
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
//    public void updateCartNum(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        //我们可能需要使用到uid
//        User user = (User)request.getSession().getAttribute(Const.LOGIN_USER);
//        Integer pid = Integer.valueOf(request.getParameter("pid"));//商品pid
//        Integer cnum = Integer.valueOf(request.getParameter("cnum"));//商品变化数量
//        //0,即触发删除动作
//         if (cnum == 0){
//            CS.deleteCartByUid(user.getUid(),pid);
//         }else {
//             Integer pprice = Integer.valueOf(request.getParameter("pprice"));//单价
//             //调用业务层做数据变化处理
//             Cart cart = new Cart();
//             Product product = new Product();
//             //设置商品数量
//             cart.setCnum(cnum);
//             //设置用户uid
//             cart.setUid(user.getUid());
//             //创建了商品的对象，设置它的商品pid，因为dao里面我们需要使用到pid来修改数据
//             product.setPid(pid);
//             //把创建出来的商品对象赋值给购物车
//             cart.setProduct(product);
//             //设置购物车的小计金额
//             cart.setCcount(cnum * pprice);
//             //修改业务调用
//             CS.updateCartSetCnumAndCcount(cart);
//         }
//    }

    public void updateCartNum(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //我们可能需要使用到uid
        User user = (User) request.getSession().getAttribute(Const.LOGIN_USER);
        Integer pid = Integer.valueOf(request.getParameter("pid"));//商品pid
        Integer cnum = Integer.valueOf(request.getParameter("cnum"));//商品变化数量
        Integer pprice = Integer.valueOf(request.getParameter("pprice"));//单价
        //0,即触发删除动作
        Cart cart = CS.selectCartProductByUidAndPid(user.getUid(), pid);//使用uid+pid来查询到这个条购物车数据
        Integer proNum = cart.getCnum() + cnum;//如果是-1 变成原数量-1 如果1原数量+1
        if (proNum == 0) {//操作商品数量后，数量为0即做删除东西
            System.out.println("pid" + pid);
            CS.deleteCartByUid(user.getUid(), pid);
        } else {
            cart.setCnum(cart.getCnum() + cnum);//1 -1
            cart.setCcount(cart.getCcount() + (cnum * pprice));//40 （-1*20）
            CS.updateCartSetCnumAndCcount(cart);
        }
    }
}
